package org.jeecg.modules.oms.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.oms.entity.SemiProductSalesOrderTransaction;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 半成品销售订单交易记录Service接口
 */
public interface ISemiProductSalesOrderTransactionService extends IService<SemiProductSalesOrderTransaction> {

    /**
     * 根据订单ID查询交易记录列表
     * @param orderId 订单ID
     * @return 交易记录列表
     */
    List<SemiProductSalesOrderTransaction> getByOrderId(String orderId);

    /**
     * 分页查询交易记录
     * @param page 分页参数
     * @param transaction 查询条件
     * @return 分页结果
     */
    IPage<SemiProductSalesOrderTransaction> queryTransactionPage(Page<SemiProductSalesOrderTransaction> page, SemiProductSalesOrderTransaction transaction);

    /**
     * 根据交易类型查询记录
     * @param orderId 订单ID
     * @param transactionType 交易类型
     * @return 交易记录列表
     */
    List<SemiProductSalesOrderTransaction> getByTransactionType(String orderId, Integer transactionType);

    /**
     * 添加交易记录
     * @param transaction 交易记录
     * @return 添加结果
     */
    boolean addTransaction(SemiProductSalesOrderTransaction transaction);

    /**
     * 更新交易记录
     * @param transaction 交易记录
     * @return 更新结果
     */
    boolean updateTransaction(SemiProductSalesOrderTransaction transaction);

    /**
     * 删除交易记录
     * @param id 记录ID
     * @return 删除结果
     */
    boolean deleteTransaction(String id);

    /**
     * 计算订单已付金额
     * @param orderId 订单ID
     * @return 已付金额
     */
    BigDecimal calculatePaidAmount(String orderId);

    /**
     * 计算订单预付款金额
     * @param orderId 订单ID
     * @return 预付款金额
     */
    BigDecimal calculatePrepaymentAmount(String orderId);

    /**
     * 计算订单尾款金额
     * @param orderId 订单ID
     * @return 尾款金额
     */
    BigDecimal calculateFinalPaymentAmount(String orderId);

    /**
     * 计算订单退款金额
     * @param orderId 订单ID
     * @return 退款金额
     */
    BigDecimal calculateRefundAmount(String orderId);

    /**
     * 统计交易记录数量
     * @param orderId 订单ID
     * @return 记录数量
     */
    Integer countByOrderId(String orderId);

    /**
     * 根据交易人查询记录
     * @param transactionPersonId 交易人ID
     * @return 交易记录列表
     */
    List<SemiProductSalesOrderTransaction> getByTransactionPerson(String transactionPersonId);

    /**
     * 根据支付方式查询记录
     * @param paymentMethod 支付方式
     * @return 交易记录列表
     */
    List<SemiProductSalesOrderTransaction> getByPaymentMethod(Integer paymentMethod);

    /**
     * 根据时间范围查询交易记录
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 交易记录列表
     */
    List<SemiProductSalesOrderTransaction> getByTimeRange(Date startTime, Date endTime);

    /**
     * 批量插入交易记录
     * @param transactionList 交易记录列表
     * @return 插入结果
     */
    boolean batchInsertTransactions(List<SemiProductSalesOrderTransaction> transactionList);

    /**
     * 验证交易记录数据
     * @param transaction 交易记录
     * @return 验证结果
     */
    boolean validateTransaction(SemiProductSalesOrderTransaction transaction);

    /**
     * 处理付款
     * @param orderId 订单ID
     * @param amount 付款金额
     * @param transactionType 交易类型
     * @param paymentMethod 支付方式
     * @param transactionPersonId 交易人ID
     * @param description 交易描述
     * @param voucher 交易凭证
     * @return 处理结果
     */
    boolean processPayment(String orderId, BigDecimal amount, Integer transactionType, 
                          Integer paymentMethod, String transactionPersonId, 
                          String description, String voucher);

    /**
     * 处理退款
     * @param orderId 订单ID
     * @param amount 退款金额
     * @param transactionPersonId 交易人ID
     * @param description 退款描述
     * @param reason 退款原因
     * @return 处理结果
     */
    boolean processRefund(String orderId, BigDecimal amount, String transactionPersonId, 
                         String description, String reason);

    /**
     * 根据订单ID删除交易记录
     * @param orderId 订单ID
     * @return 删除结果
     */
    boolean deleteByOrderId(String orderId);
}
